package com.aplink.generic.xmlparser;

import android.content.Context;

import com.aplink.generic.constant.ConfigParameter;
import com.aplink.generic.pojo.xml.RecordInfo;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;

import javax.xml.parsers.ParserConfigurationException;

public class RecordInfoParser {

    public static ArrayList<RecordInfo> parse( Document doc ) {

        final ArrayList<RecordInfo> recordInfoList = new ArrayList<RecordInfo>();
        final NodeList nList = doc
                .getElementsByTagName( ConfigParameter.TABLE_STRUCTURE );

        for ( int temp = 0 ; temp < nList.getLength() ; temp++ ) {

            final RecordInfo recordInfo = new RecordInfo();
            final Node nNode = nList.item( temp );
            String tableId = "";
            // set tableInfo ID
            if ( nNode.hasAttributes() ) {
                final Attr attr = (Attr) nNode.getAttributes().getNamedItem(
                        ConfigParameter.TABLE_ID );
                if ( attr != null ) {
                    tableId = attr.getNodeValue();
                    recordInfo.setmTableName( tableId );
                }
            }

            final ArrayList<Hashtable<String, String>> mRecords = new ArrayList<Hashtable<String, String>>();

            // set obj_prop tags
            if ( nNode.getNodeType() == Node.ELEMENT_NODE ) {

                final Element element = (Element) nNode;

                // get Obj_prop tags of this node
                final NodeList recordNodes = element
                        .getElementsByTagName( ConfigParameter.TABLE_DATA_RECORD );

                for ( int recordIndex = 0 ;
                      recordIndex < recordNodes.getLength() ; recordIndex++ ) {

                    final Hashtable<String, String> record = new Hashtable<String, String>();
                    final Node nRecordNode = recordNodes.item( recordIndex );
                    final Element elementRecordNode = (Element) nRecordNode;
                    final NodeList nodes = elementRecordNode
                            .getElementsByTagName( ConfigParameter.TABLE_DATA_ATTRIBUTE );

                    for ( int attributeIndex = 0 ; attributeIndex < nodes
                            .getLength() ; attributeIndex++ ) {
                        final Node nAtrributeNode = nodes.item( attributeIndex );

                        String atributeId = "";
                        String atributeValue = "";

                        if ( nAtrributeNode.hasAttributes() ) {
                            Attr attr = (Attr) nAtrributeNode.getAttributes()
                                    .getNamedItem(
                                            ConfigParameter.TABLE_ATTRIBUTE_ID );
                            if ( attr != null ) {
                                atributeId = attr.getNodeValue();
                            }
                            attr = (Attr) nAtrributeNode
                                    .getAttributes()
                                    .getNamedItem(
                                            ConfigParameter.TABLE_ATTRIBUTE_VALUE );
                            if ( attr != null ) {
                                atributeValue = attr.getNodeValue();
                            }

                            if ( atributeId != "" ) {
                                record.put( atributeId, atributeValue );
                            }
                        }
                    }
                    // add to main Records of this table
                    mRecords.add( record );

                }
            }

            // set recordInfo for this table
            recordInfo.setmRecordList( mRecords );
            recordInfoList.add( recordInfo );

        }
        return recordInfoList;
    }

    public static ArrayList<RecordInfo> parseRecordsTables(
            Context paramContext, int xmlFileId ) {
        try {
            final Document document = XMLPaserUtil.openDocumentFrom( paramContext,
                    xmlFileId );
            return parse( document );
        } catch ( final ParserConfigurationException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch ( final SAXException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch ( final IOException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public static ArrayList<RecordInfo> parseRecordsTables(
            Context paramContext, String xmlFileName ) {
        try {
            final Document document = XMLPaserUtil.openDocumentFrom( paramContext,
                    xmlFileName );
            return parse( document );
        } catch ( final ParserConfigurationException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch ( final SAXException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch ( final IOException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}
